/**
* ApeDSLib - Falleco DS Library
* Copyright (C) 2009  Crisanto, Israel (Falleco)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*/
#ifndef _APEDSLIB_CANVAS_HPP_
#define _APEDSLIB_CANVAS_HPP_

#include <nds.h>
#include <cstdio>

/**
* Uma classe para armazenar imagens de modo genérico
*/
class Canvas {
public:
   /**
   *
   */
   Canvas( u16* src, int w, int h, bool t = false );

   /**
   *
   */
   ~Canvas( void );

   /**
   * Retorna a largura
   */
   int getWidth( void ) const { return width; };

   /**
   * Retorna a altura da imagem
   */
   int getHeight( void ) const { return height; };

   /**
   * Define a cor da máscara
   */
   void setMask(u16 color) { mask = color; };

   /**
   *
   */
   u16 getMask(void) { return mask; };

   /**
   * Define se devemos usar transparencia ou não
   */
   void setAlpha(bool use) { useAlpha = use; };

   bool usingAlpha( void ) { return useAlpha; };

   /**
   * Seta a cor de um pixel
   */
   void setPixel( u16 color, int x, int y);

   /**
   * Desenha uma linha
   */
   void drawLine( u16 color, int x1, int y1, int x2, int y2 );

   /**
   * Desenha um quadrado
   */
   void drawRect( u16 color, int x, int y, int w, int h);

   /**
   * Desenha uma janela, somente as bordas, sem preenchimento
   */
   void drawFrame( u16 color, int x, int y, int w, int h);

   /**
   * Desenha uma caixa ( bordar e preenchimento )
   */
   void drawBox( u16 bColor, u16 fColor );

   /**
   * Copia o conteúdo de outro canvas nas coordenadas passadas
   */
   void bitBlt( u16* src, int w, int h, int x = 0, int y = 0 );
   void bitBlt( Canvas* src, int x = 0, int y = 0 );

   /**
   * Retorna uma referência para os dados armazenados
   */
   u16* getBuffer( void ) const { return data; };

   /**
   *
   */
   void setBuffer(u16* buffer, int w, int h);

   /**
   * Limpa o canvas com a cor indicada
   */
   void clear(u16 color);

   /**
   * Imprime uma string na tela
   */
   u8 drawString(const char* str, u16 color = RGB15(0, 0, 0), int x = 0, int y = 0);

protected:

private:

   /**
   * Imprime uma letra na tela
   */
   u8 drawChar(char c, u16 color = RGB15(0, 0, 0), int x = 0, int y = 0);

   /**
   * Pointer to the buffer that stores binary data on memory
   */
   u16* data;

   /**
   * The class had to allocate memory by itself?
   */
   bool inner_mem;

   /**
   * Largura da imagem armazenada
   */
   int width;

   /**
   * Altura da imagem armazenada
   */
   int height;

   /**
   * Cor transparente
   */
   u16 mask;

   /**
   * Usar transparencia
   */
   bool useAlpha;
};

#endif //~ _APEDSLIB_CANVAS_HPP_